const puppeteer = require('puppeteer');   // 无头浏览器
const request = require('request');       // 文件下载
const Async = require('async');           // 处理下载并发
const fs = require('fs');                 // nodejs文件操作模块
const mkdirp = require('mkdirp');         // 创建文件
const path = require('path');
let index = 0;
let dir = './images';                     // 文件保存的路径
mkdirp(dir, function(err) {               // 如果没有这个文件夹，就创建一个
    if(err){
        console.log(err);
    }
});

let pagenum = 1 ;                            // 需要爬虫多少个页面的文件


var downloadImage = function(src, dest, callback) {
    request.head(src, function(err, res, body) {
        if (src) {
            // request中间件，以流的方式写入文件
            request(src).pipe(fs.createWriteStream(dest)).on('close', function() {
                callback(null, dest);
            });
        }
    });

};
const NeteaseImg = async () => {
    const getOnePageData = async (page, pageNumber) => {
        const url = `http://jandan.net/ooxx/page-${pageNumber}#comments`;   // 动态url地址
        await page.goto(url,{waitUntil: 'networkidle2'});    // 跳转到页面    并且页面加载完成
        await page.setViewport({                            // 设置浏览器的宽高
            width: 1300,
            height: 5227,
        });

        await page.waitFor(2000);                           // 等待两秒，加载图片

        const result = await page.evaluate(() => {
            let data = [] ;
            let elements = document.querySelectorAll('.row .text');
            for(let i of elements){
                let imgPath = i.querySelector('img').src;
                data.push(imgPath);
            }
            return data
        });
        return result;                                      // 获取页面中的img标签的src属性
    };


    // 循环获取数据
    let imgList = [];
    const browser = await puppeteer.launch({headless: false, args: ['--no-sandbox']});  // 打开一个浏览器
    const page = await browser.newPage();                                               // 新建页面
    let filelen = 0;         // 当前页面的有多少条数据
    for(let i = 1 ; i <= pagenum ; i++){
        const item = await getOnePageData(page, i);         // 动态把url路径传回getOnePageData
        console.log(`总共获取到数据${filelen+=item.length}条。`);
        imgList = imgList.concat(item);
    }


    Async.mapSeries(imgList, function(item, callback) {
        setTimeout(function() {
            // 截取文件名
            var destImage = path.resolve("./images/", item.split("/")[item.split("/").length -1]);
            downloadImage(item, destImage, function(err, data){
                console.log("["+ index++ +"]: " + data);
            });
            callback(null, item);
        }, 100);
    }, function(err, results) {});




    browser.close();

};

NeteaseImg();